// config/config.go
package config

import (
	"log"
	"os"

	"gopkg.in/yaml.v3"
	// "v2/metrics"
	// "time"
)

type ServerConfig struct {
	Port     int    `yaml:"port"`
	LogLevel string `yaml:"log_level"`
}

type BasicAuthConfig struct {
	Username string `yaml:"username"`
	Password string `yaml:"password"`
}

type ChannelConfig struct {
	Enable  bool   `yaml:"enable"`
	Webhook string `yaml:"webhook"`
}

type Redis struct {
	Host         string `yaml:"host"`
	Port         int    `yaml:"port"`
	Password     string `yaml:"password"`
	DB           int    `yaml:"db"`
	PoolSize     int    `yaml:"pool_size"`
	AlertVarsTTL int    `yaml:"alert_vars_ttl"` // 告警变量在 Redis 中的过期时间（小时）
}

type WeComAppConfig struct {
	Enable               bool   `yaml:"enable"`                   //是否开启
	CorpID               string `yaml:"corp_id"`                  //企业 id
	Secret               string `yaml:"secret"`                   //# 企业应用 secret
	AgentID              int    `yaml:"agent_id"`                 //# 应用agent id
	MsgEncToken          string `yaml:"msg_enc_token"`            // 应用接收消息 Token
	MsgEncEncodingAESKey string `yaml:"msg_enc_encoding_aes_key"` //应用接收消息 EncodingAESKey
}

// DingTalkAppConfig 钉钉应用消息配置
type DingTalkAppConfig struct {
	Enable    bool   `yaml:"enable"`
	AppKey    string `yaml:"app_key"`
	AppSecret string `yaml:"app_secret"`
	AgentID   int    `yaml:"agent_id"`
}

type DingTalkHTTPConfig struct {
	Enable         bool   `yaml:"enable"`
	AppKey         string `yaml:"app_key"`
	AppSecret      string `yaml:"app_secret"`
	AgentID        int    `yaml:"agent_id"`
	Token          string `yaml:"token"`
	EncodingAESKey string `yaml:"encoding_aes_key"`
}

type DingTalkStreamConfig struct {
	Enable              bool   `yaml:"enable"`
	ClientID            string `yaml:"client_id"`
	ClientSecret        string `yaml:"client_secret"`
	CardTemplateID      string `yaml:"card_template_id"`
	GroupConversationID string `yaml:"group_conversation_id"`
}

// FeiShuAppConfig 飞书应用消息配置
type FeiShuAppConfig struct {
	Enable                      bool     `yaml:"enable"`
	AppID                       string   `yaml:"app_id"`
	AppSecret                   string   `yaml:"app_secret"`
	ReceiveIDType               string   `yaml:"receive_id_type"` // user_id, open_id, chat_id  这里只选择openid 是根据谁关注应用 识别手机号然后发送消息
	PhoneNumbers                []string `yaml:"phone_numbers"`   // 添加手机号列表
	AlertCardTemplateID         string   `yaml:"alert_card_template_id"`
	AlertResolvedCardTemplateID string   `yaml:"alert_resolved_card_template_id"`
	VerificationToken           string   `yaml:"verification_token"`
	EncryptKey                  string   `yaml:"encrypt_key"`

	//user_id（租户内用户唯一标识）  open_id（应用内用户唯一标识）   chat_id（群聊唯一标识）
}

type FeiShuStreamConfig struct {
	Enable                      bool     `yaml:"enable"`
	AppID                       string   `yaml:"app_id"`
	AppSecret                   string   `yaml:"app_secret"`
	ReceiveIDType               string   `yaml:"receive_id_type"`                 // user_id, open_id, chat_id  这里只选择openid
	PhoneNumbers                []string `yaml:"phone_numbers"`                   // 添加手机号列表
	AlertCardTemplateID         string   `yaml:"alert_card_template_id"`          //告警通知卡片
	AlertResolvedCardTemplateID string   `yaml:"alert_resolved_card_template_id"` //告警解决通知卡片
	AlertClaimedCardTemplateID  string   `yaml:"alert_claimed_card_template_id"`  //告警认领通知卡片
	AlertMutedCardTemplateID    string   `yaml:"alert_muted_card_template_id"`    //告警屏蔽通知卡片
	VerificationToken           string   `yaml:"verification_token"`
	EncryptKey                  string   `yaml:"encrypt_key"`
	ChatIDs                     []string `yaml:"chat_ids"`
}

// AlertSourceConfig 告警源配置
type AlertSourceConfig struct {
	SkyWalkingEnable bool `yaml:"skywalking_enable"`
	KubeEventEnable  bool `yaml:"kube_event_enable"`
	FalcoEnable      bool `yaml:"falco_enable"`
}

type NotifierConfig struct {
	WeCom          ChannelConfig        `yaml:"wecom"`
	FeiShu         ChannelConfig        `yaml:"feishu"`
	DingTalk       ChannelConfig        `yaml:"dingtalk"`
	WeComApp       WeComAppConfig       `yaml:"wecom_app"` // 新增：企业微信应用
	DingTalkApp    DingTalkAppConfig    `yaml:"dingtalk_app"`
	FeiShuApp      FeiShuAppConfig      `yaml:"feishu_app"`
	DingTalkHTTP   DingTalkHTTPConfig   `yaml:"dingtalk_http"`
	FeiShuStream   FeiShuStreamConfig   `yaml:"feishu_stream"`
	DingTalkStream DingTalkStreamConfig `yaml:"dingtalk_stream"`
}

type Nightingale struct {
	Enable          bool   `yaml:"enable"`
	URL             string `yaml:"url"`
	Username        string `yaml:"username"`          // 添加用户名
	Password        string `yaml:"password"`          // 添加密码
	MuteDuration2h  int    `yaml:"mute_duration_2h"`  // 屏蔽2小时的持续时间（小时）
	MuteDuration24h int    `yaml:"mute_duration_24h"` // 屏蔽24小时的持续时间（小时）
}

type Config struct {
	Server      ServerConfig     `yaml:"server"`
	BasicAuth   BasicAuthConfig  `yaml:"basic_auth"`
	Notifier    NotifierConfig   `yaml:"notifier"`
	Redis       Redis            `yaml:"redis"`
	Nightingale Nightingale      `yaml:"nightingale"`
	AlertSource AlertSourceConfig `yaml:"alert_source"`
}

// 全局配置变量
var Global Config

// Load 从指定文件路径加载 YAML 配置
func Load(configFile string) error {
	data, err := os.ReadFile(configFile)
	if err != nil {
		return err
	}

	if err := yaml.Unmarshal(data, &Global); err != nil {
		return err
	}
	os.Setenv("LOG_LEVEL", Global.Server.LogLevel)
	if Global.Server.LogLevel == "" {
		os.Setenv("LOG_LEVEL", "info")
	}
	// 设置默认值
	if Global.Server.Port == 0 {
		Global.Server.Port = 8080
	}

	log.Printf("✅ 配置加载成功: 服务监听端口 %d", Global.Server.Port)
	if Global.Notifier.WeCom.Enable {
		log.Printf("🟢 已启用: 企业微信webhhook")
	}
	if Global.Notifier.FeiShu.Enable {
		log.Printf("🔵 已启用: 飞书webhhook")
	}
	if Global.Notifier.DingTalk.Enable {
		log.Printf("🟣 已启用: 钉钉webhhook")
	}
	if Global.Notifier.WeComApp.Enable {
		log.Printf("🟢 已启用: 企业微信应用中心")
	}
	if Global.Notifier.DingTalkApp.Enable {
		log.Printf("🟢 已启用: 钉钉应用中心")
	}
	if Global.Notifier.FeiShuApp.Enable {
		log.Printf("🟢 已启用: 飞书应用中心")
	}
	return nil
}